1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #include<iostream> #include<cstdio> #include<algorithm> #include<cctype> #include<cstring> #include<cmath> #include<vector> using namespace std; inline int read(){ int w=0,x=0;char c=getchar(); while(!isdigit(c))w|=c=='-',c=getchar(); while(isdigit(c))x=x*10+(c^48),c=getchar(); return w?-x:x; } namespace star { const int maxn=1e5+10; int n,m,c[maxn],C[maxn],ans[maxn],siz[maxn],rt,mx[maxn],lst[maxn]; bool vis[maxn],mark[maxn]; struct que{ int l,r,id; que(){} que(int l,int r,int id):l(l),r(r),id(id){} bool operator < (const que &b) const {return r<b.r;} }; vector<int> V[maxn]; vector<que> qu[maxn],a,q; inline void insert(int x,int k){if(x)for(;x<=n;x+=x&-x) C[x]+=k;} inline int query(int x){int ans=0;for(;x;x-=x&-x) ans+=C[x]; return ans;} void getrt(int x,int fa,int S){ siz[x]=1,mx[x]=0; for(auto u:V[x]) if(!vis[u] and u!=fa) getrt(u,x,S),mx[x]=max(mx[x],siz[u]),siz[x]+=siz[u]; if((mx[x]=max(mx[x],S-siz[x]))<mx[rt]) rt=x; } void dfs(int x,int fa,int l,int r){ siz[x]=1,a.emplace_back(l,r,c[x]); for(auto u:qu[x]) if(!mark[u.id] and u.l<=l and r<=u.r) mark[u.id]=true,q.push_back(u); for(auto u:V[x]) if(!vis[u] and u!=fa) dfs(u,x,min(l,u),max(r,u)),siz[x]+=siz[u]; } void solve(int x){ vis[x]=true; a.clear(),q.clear(),dfs(x,0,x,x); sort(a.begin(),a.end()),sort(q.begin(),q.end()); for(int i=0,j=0;i<q.size();i++){ while(j<a.size() and a[j].r<=q[i].r){ if(a[j].l>lst[a[j].id]) insert(lst[a[j].id],-1),insert(lst[a[j].id]=a[j].l,1); ++j; } ans[q[i].id]=query(n)-query(q[i].l-1); } for(auto u:a) insert(lst[u.id],-1),lst[u.id]=0; for(auto u:V[x]) if(!vis[u]) rt=0,getrt(u,x,siz[u]),solve(rt); } inline void work(){ n=read(),m=read(),mx[0]=n+1; for(int i=1;i<=n;i++) c[i]=read(); for(int u,v,i=1;i<n;i++) u=read(),v=read(),V[u].push_back(v),V[v].push_back(u); for(int l,r,i=1;i<=m;i++) l=read(),r=read(),qu[read()].emplace_back(l,r,i); getrt(1,0,n),solve(rt); for(int i=1;i<=m;i++) printf("%d\n",ans[i]); } } signed main(){ star::work(); return 0; }
|